/*
 Copyright (c) [Year] [name of copyright holder]
 [Software Name] is licensed under Mulan PSL v2.
 You can use this software according to the terms and conditions of the Mulan
 PSL v2.
 You may obtain a copy of Mulan PSL v2 at:
          http://license.coscl.org.cn/MulanPSL2
 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
 KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
 NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 See the Mulan PSL v2 for more details.
*/

// #include "PasteThreadPool.hpp"

// /**
//  * @brief 在线程池中排队一个任务以供以后执行
//  *
//  * @tparam F 要排队的任务的类型
//  * @tparam Args 任务的参数类型
//  * @param f 要排队的任务
//  * @param args 任务的参数
//  * @return 返回任务的结果的future
//  *
//  * 此函数通过创建一个packaged_task来包装传入的任务f和其参数args，然后将该任务添加到线程池的任务队列中
//  * 它还通过get_future方法返回一个future对象，该future对象可以用来获取任务的执行结果
//  *
//  * 注意：该函数使用了右值引用和std::forward来完美转发任务和参数，以确保高效的内存管理和性能
//  */
// template <typename F, typename... Args>
// auto PasteThreadPool::enqueue(F &&f, Args &&...args) -> std::future<typename std::invoke_result_t<F, Args...>::type> {
//     // 定义任务的返回类型
//     using return_type = typename std::invoke_result_t<F, Args...>::type;

//     // 创建一个packaged_task对象，它将用于存储任务和其参数，并允许异步执行任务
//     auto task =
//         std::make_shared<std::packaged_task<return_type()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));

//     // 获取任务的future，这将用于获取任务的执行结果
//     std::future<return_type> res = task->get_future();
//     {
//         // 锁住互斥锁以保护任务队列
//         std::unique_lock<std::mutex> lock(_queue_mutex);

//         // 如果线程池已经停止，则抛出异常
//         if (_stop)
//             throw std::runtime_error("不能在已经停止的线程池中排队");

//         // 将一个lambda函数添加到_tasks容器中
//         _tasks.emplace([task]() { (*task)(); });
//     }
//     // 通知条件变量以唤醒一个等待的线程来执行任务
//     _condition.notify_one();
//     return res;
// }

// // 构造函数：初始化线程池并启动指定数量的工作线程
// PasteThreadPool::PasteThreadPool(size_t numThreads) {
//     // 遍历创建numThreads个线程，并将它们添加到线程池中
//     for (size_t i = 0; i < numThreads; ++i)
//         // 创建并启动一个新的工作线程
//         _workers.emplace_back([this] {
//             while (true) {
//                 std::function<void()> task;
//                 {
//                     // 锁定互斥量以安全地访问任务队列
//                     std::unique_lock<std::mutex> lock(this->_queue_mutex);
//                     // 等待条件变量，直到线程池停止或有任务需要处理
//                     this->_condition.wait(lock, [this] { return this->_stop || !this->_tasks.empty(); });
//                     // 如果线程池已停止且没有剩余任务，则退出线程
//                     if (this->_stop && this->_tasks.empty())
//                         return;
//                     // 从任务队列中取出一个任务并将其移除队列
//                     task = std::move(this->_tasks.front());
//                     this->_tasks.pop();
//                 }
//                 // 执行取出的任务
//                 task();
//             }
//         });
// }

// // 线程池析构函数
// PasteThreadPool::~PasteThreadPool() {
//     // 确保线程安全地停止线程池
//     {
//         std::unique_lock<std::mutex> lock(_queue_mutex);
//         _stop = true;
//     }
//     // 通知所有等待的线程可以继续执行，以便它们可以检查_stop标志并退出
//     _condition.notify_all();
//     // 等待所有工作线程完成当前任务并退出
//     for (std::thread &worker : _workers) {
//         if (worker.joinable()) {
//             worker.join();
//         }
//     }
// }